﻿using System.Drawing;

namespace GraphDrawing.Graph.Behaviors
{
    public abstract class ModelStatePresenter
    {
        protected readonly ModelStateContext context;

        protected ModelStatePresenter(ModelStateContext context)
        {
            this.context = context;
        }

        public abstract void OnMouseMove(Point p);

        public virtual void OnMouseUp(Point p)
        {
        }
    }

    public class IdleState : ModelStatePresenter
    {
        public static readonly IdleState INSTANCE = new IdleState();

        IdleState() : base(null)
        {
        }

        public override void OnMouseMove(Point p)
        {
        }
    }

    /// <summary>
    /// Состояние перемещения области отображения в пространстве.
    /// </summary>
    public class ViewPortMovingState : ModelStatePresenter
    {
        /// <summary>
        /// Координаты точки, в которой начато перемещение.
        /// </summary>
        Point originPoint;

        /// <summary>
        /// Создаёт новый экземпляр состояния.
        /// </summary>
        /// <param name="context">Контекст.</param>
        /// <param name="clientPoint">Точка в координатах области отображения.</param>
        public ViewPortMovingState(ModelStateContext context, Point clientPoint) : base(context)
        {
            originPoint = clientPoint;
        }

        public override void OnMouseMove(Point p)
        {
            context.CanvasModel.ViewPort.Move(p.X - originPoint.X, p.Y - originPoint.Y);
            originPoint = p;
            context.Canvas.UpdateView();
        }
    }
}
